import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 代码生成器
 *
 * @author 史绍波
 * @date 2020/4/11 22:28
 */
public class CodeGenerator {

    private static String author="史绍波";
    /** 模块名 */
    private static String packageName="user";
    /** 自定义包路径 */
    private static String parent = "com.cn.bopu.common.upms." + packageName;
    /** 是否覆盖 */
    private static Boolean isFileOverride = true;
    /** 主键生成策略 */
    private static IdType idType = IdType.UUID;

    private static String drivername = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://49.232.158.131:3306/bopu-dev?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true";
    private static String username = "root";
    private static String password = "BB@play_8022";

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        AutoGenerator generator = new AutoGenerator();
        // 全局变量配置
        GlobalConfig gc = new GlobalConfig();
        //当前项目
        String projectPath = System.getProperty("user.dir");
        // 输出路径
        gc.setOutputDir(projectPath+"/src/main/java");
        // 默认 false ,是否覆盖已生成文件
        gc.setFileOverride(isFileOverride);
        //默认true ,是否打开输出目录
        gc.setOpen(false);
        // 默认false,是否开启二级缓存
        gc.setEnableCache(false);
        // 作者
        gc.setAuthor(author);
        //默认false
        gc.setSwagger2(true);
        // 默认false
        gc.setBaseResultMap(true);
        // 时间策略 默认TIME_PACK
        gc.setDateType(DateType.TIME_PACK);
        //默认false  和basemodel相似
        gc.setBaseColumnList(true);
        gc.setEntityName("%s");
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        // 指定生成的主键类型
        gc.setIdType(idType);
        generator.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dc = new DataSourceConfig();
        // 数据库信息查询 //默认mysql
        dc.setDbQuery(new MySqlQuery());
        // 数据库类型
        dc.setDbType(DbType.MYSQL);
        //类型转换 默认mysql
        dc.setTypeConvert(new MySqlTypeConvert());
        dc.setUrl(url);
        dc.setDriverName(drivername);
        dc.setUsername(username);
        dc.setPassword(password);
        generator.setDataSource(dc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //代码生成到哪个包下面
        pc.setParent(parent);
        pc.setService("service");
//        pc.setModuleName(""); //此处是所属模块名称
//        pc.setEntity("entity"); //默认entity,controller,service,service.impl,mapper,mapper.xml
        generator.setPackageInfo(pc);
        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        /**
         * 将xml生成到resource下面
         */
        // Velocity模板
        String templatePath = "/templates/mapper.xml.vm";
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return projectPath + "/src/main/resources/mapper/"
                        + packageName
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        generator.setCfg(cfg);

        // 配置模板
        TemplateConfig tc = new TemplateConfig();
        // templates/entity.java 模板路径配置，默认在templates目录下，.vm 后缀不用加
        //使用自定义模板生成实体类
        tc.setEntity("templates/entity.java");
        tc.setXml("");
        generator.setTemplate(tc);

        // 数据库表配置
        StrategyConfig sc = new StrategyConfig();
        //是否大写命名 默认false
        sc.setCapitalMode(false);
        //是否跳过试图 默认false
        sc.setSkipView(true);
        // 表映射 驼峰命名
        sc.setNaming(NamingStrategy.underline_to_camel);
        // 字段映射 驼峰
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        //是否使用lombak 默认为false
        sc.setEntityLombokModel(true);
        // 默认false
        sc.setRestControllerStyle(true);
        //默认true
        sc.setEntitySerialVersionUID(true);
        //默认false 将mysql字段名生成静态变量
        sc.setEntityColumnConstant(true);
        //表名，用，隔开  需要生产
        sc.setInclude(scanner("表名，多个英文逗号分割").split(","));
        //     sc.setExclude(""); //                 不需要生成  二选一
        // 默认false 注释
        sc.setEntityTableFieldAnnotationEnable(true);
        //默认false
        sc.setControllerMappingHyphenStyle(false);
        // 逻辑删除字段名称
        sc.setLogicDeleteFieldName("status");
        generator.setStrategy(sc);

        // 模板引擎
        generator.setTemplateEngine(new VelocityTemplateEngine());
        generator.execute();
    }
}
